package com.yuw.dz;

/**
 * 数组使用
 */
public class TestDriver {
    public static void main(String[] args) {
        test01();
        System.out.println("==============================================");
        test02();
        System.out.println("==============================================");
        test03();
    }

    /**
     * 二维数组的使用
     */
    private static void test03() {
        // 数组声明
        int[][] arrVal1 = new int[5][5]; // 规则的二维数组
        int[][] arrVal2 = new int[][]{{1, 2, 3, 4, 5}, {6, 7, 8, 9},{11, 12, 13, 14, 15}}; // 可能出现不规则的二维数组
        int[][] arrVal3 = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}; // 可能出现不规则的二维数组
        // 读取数组中的一个元素
        System.out.println("arrVal3[0][2]=" + arrVal3[0][2]);

        // 给二维数组的元素进行赋值
        arrVal1[0][2] = 100;

        // 数组的遍历
        System.out.println("使用for循环进行二维数组的遍历：");
        // 外层for循环遍历行，i表示数组的行，是数组的行下标
        // arrVal1.length 表示数组的行数
        for (int i = 0; i < arrVal2.length; i++) {
            // 内层for循环遍历列，j表示数组的列，是数组的列下标
            // arrVal1[i].length 表示下标为i这一行中的列数
            for (int j = 0; j < arrVal2[i].length; j++) {
                // 打印指定行和列下标的元素值
                System.out.print("    " + arrVal2[i][j]);
            }
            // 每一行打印完成之后要进行换行
            System.out.println();
        }

    }

    /**
     * 二维数组的使用
     */
    private static void test02() {
        // 数组声明
        int[][] arrVal1 = new int[5][5];
        int[][] arrVal2 = new int[][]{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
        int[][] arrVal3 = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}; // 编译器新特性？
        // 读取数组中的一个元素
        System.out.println("arrVal3[0][2]=" + arrVal3[0][2]);

        // 给二维数组的元素进行赋值
        arrVal1[0][2] = 100;

        // 数组的遍历
        System.out.println("使用for循环进行二维数组的遍历：");
        // 外层for循环遍历行，i表示数组的行，是数组的行下标
        // arrVal1.length 表示数组的行数
        for (int i = 0; i < arrVal1.length; i++) {
            // 内层for循环遍历列，j表示数组的列，是数组的列下标
            // arrVal1[i].length 表示下标为i这一行中的列数
            for (int j = 0; j < arrVal1[i].length; j++) {
                // 打印指定行和列下标的元素值
                System.out.print("    " + arrVal1[i][j]);
            }
            // 每一行打印完成之后要进行换行
            System.out.println();
        }

    }

    /**
     * 一维数组的使用
     */
    private static void test01() {
        // 数组声明
        int[] arrVal1 = new int[5];
        int[] arrVal2 = new int[]{1, 2, 3, 4, 5};
        int[] arrVal3 = {1, 2, 3, 4, 5}; // 编译器新特性？
        // 读取数组中的一个元素
        System.out.println("arrVal3[0]=" + arrVal3[0]);

        // 使用下标给数组元素进行初始化赋值
        arrVal1[1] = 100;
        //arrVal1[8] = 100;// 下标超出范围，引起下标越界异常
        // 数组的遍历
        // i是数组的下标
        System.out.println("使用for循环进行数组的遍历：");
        for (int i = 0; i < arrVal1.length; i++) {
            System.out.print("    " + arrVal1[i]);
        }
        // 换行
        System.out.println();
        System.out.println("使用增强型的for循环遍历数组：");
        // 增强型的for循环的使用
        /*
        语法解析：
            使用局部变量 eachValue 从被遍历的数据集（数组）中，从头到尾依次取出每个存储单元的值，进行遍历；
            每次for循环都是使用变量 eachValue从集合中取出元素值，每次循环中 eachValue的值是需要更新的；

            没有使用遍历的下标，不知道本次循环是第几次；
            好处：不用担心下标越界问题；
         */
        for (int eachValue : arrVal1) {
            System.out.print("    " + eachValue);
        }
        // 换行
        System.out.println();

        // 课堂作业： 使用 while、do-while遍历数组；

    }
}
